# 客户端：
import socket, time
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cli.connect(('localhost', 9000))

def p(total_size):                                              #生成器
    new_p = 0                                                 #下载大小的百分比
    while new_p <= 100:                                      #如果数值小于100 进入循环
        new_size = yield                                     #在这里程序中断 主程序运行    ，接收从主程序传来的值
        now_p = int(new_size / total_size * 100)              #得出现在下载大小的百分比
        if now_p > new_p:                                    #代表进度长了 1  就执行if
            print(f'\r[{now_p}%{now_p* ">" }]', end='', flush=True)       #用print输出进度条
            time.sleep(0.5)
            new_p = now_p




while 1:
    #     1.发送指令 下载文件     get filename
    cmd = input('input>>>').strip()
    if not cmd:
        continue
    if cmd == 'q':
        break
    cli.send(cmd.encode())
#     2.接收服务器端传送的固定消息头   解析
    raw_mag_head = cli.recv(32).decode()
    #     3.拿到文件大小
    file_size = int(raw_mag_head.split('|')[1])
#     4.本地创建一个新文件 ， 文件名+dowlond
    file_name = cmd.split()[1]
    f = open(f'{file_name}.download', 'wb')
#     5. 循环接收数据
    p = p(file_size)                 #创建生成器（进度条对象）
    p.__next__()                     #运行生成器
    new_size = 0
    while new_size < file_size:
        d = cli.recv(1024)
        new_size += len(d)
        f.write(d)
        p.send(new_size)             #给生成器传现在收到的数值大小



    f.close()
    print(f'\n{file_name} done size:{file_size}')









